home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / data / chat / chat.plt < prev    next >
Text File  |  1991-10-18  |  12KB  |  399 lines

  1. /* CHAT.PLT: 1991.8.16 By GOOSE(MAF00070)
  2. ** 添付のCHAT.DOCをよく読んでから御利用下さい。
  3. ** RTCに入る前に起動して下さい。動作中は"/U"を実行しないで下さい。
  4. ** "/U"を実行すると表示がおかしくなることがあります。 */
  5.  
  6. %Y {Yes};%N {No};%DEBUG {No};%R {\n};
  7. %ABORT {dispoff(N);display({\n--応答がありません。STOPします--\n});stop};
  8. %DBG { [com] case(DEBUG,Y,com) };
  9. %PF1  {101};%PF2  {102};%PF3  {103};%PF4  {104};%PF5  {105};%PF6  {106};
  10. %PF7  {107};%PF8  {108};%PF9  {109};%PF10 {110};%PF11 {111};%PF12 {112};
  11.  
  12. %ULX1 {315};%ULY1 {21};%DRX1 {639};%DRY1 {244};
  13. %ULX2 {0};%ULY2 {21};%DRX2 {306};%DRY2 {244};
  14. %ULX3 {0};%ULY3 {418};%DRX3 {639};%DRY3 {459};
  15. var mno[1];
  16. var data1[1024];var workdata[81920];var data2[1024];
  17. var foottxt[92];var handle[32];var next[1];var xretc[3];
  18.  
  19. /*getcdirの値の補正(rootなら"\"を取り除く)*/
  20. %getcdir2 {
  21.     var temp[48];temp:=@getcdir;
  22.     case(@getchar(temp,@nochar(temp))={\},Y,{temp:=@body(temp,,{\})},N,);
  23.     im(temp)
  24. };
  25.  
  26. /* 押/クリックされたiを正しい要素番号に変換する。参照する情報は
  27. **   以下のとおり。next */
  28. %chgpfno { [i]
  29.     var retc[2];case(next!=0,Y,{retc:=next*(max-1)+i},N,{retc:=i});im(retc)
  30. };
  31.  
  32. /* strの中からdlmtで区切られたi番目以降の文字列を返す */
  33. %skipn { [str,i,dlmt]
  34.     var work[1024];var j[2];
  35.     work:=str;j:=i;
  36.     loop({case(j<=1,Y,{im(N)},N,{j:=j-1;work:=@body(work,dlmt);im(Y)})});
  37.     im(work)
  38. };
  39.  
  40. /* "ボタン//IDハンドル\n・・・"からPFiのハンドルを返す。 */
  41. %gethandle { [str,i]
  42.     %temp @tail(@head(@skipn(str,@chgpfno(i),R),R),{//});
  43.     im( @getchar(temp,9) )
  44. };
  45.  
  46. /* 以下の情報からfootnoteのボタンを作る。
  47. **   data2,next,recv */
  48. %makebtn {
  49.     var j[2];
  50.     var work[1024];j:=0;foottxt:={};
  51.     work:=@skipn(data2,@chgpfno(1),R);
  52.     loop({
  53.         %temp @head(work,R);work:=@body(work,R);j:=j+1;
  54.         case(temp<>{} && j<max,
  55.             Y,{foottxt:=foottxt|@head(temp,{//});im(Y) },
  56.             N,{im(N)}
  57.     )});
  58.     foottxt:=foottxt|{--------------------------------------------};
  59.     j:=(max-1)*4;
  60.     %temp @case(recv,Y,{im({受終})},N,{im({受始})});
  61.     foottxt:=@getchar(foottxt,1,j)|{次頁};
  62.     foottxt:=foottxt|@case(recv,Y,{im({受終})},N,{im({受始})});
  63.     foottxt:=foottxt|{終了送信};
  64. };
  65.  
  66. /*    "/U"の出力(の連続体)を受け取って"ボタン//IDハンドル\n"を変数data2に作る。 */
  67. %makebhi { [data]
  68.     var work1[1024];var work2[1024];var i[2];
  69.     work1:=data;work2:=data2;data2:={};
  70.     loop({
  71.         %temp1 @head(work2,R);work2:=@body(work2,R);
  72.         %temp2 @getchar(@tail(temp1,{//}),1,8)|{ }|@getchar(@tail(temp1,{//}),9);
  73.         case(temp1={},
  74.             Y,{im(N)},
  75.             N,{case(@body(data,temp2)<>{},Y,{data2:=data2|temp1|R});im(Y) }
  76.         )
  77.     });
  78.     loop({
  79.         %temp1 @head(work1,R);work1:=@body(work1,R);
  80.         case(temp1={},
  81.             Y,{im(N)},
  82.             N,{
  83.                 %temp2 @getchar(temp1,12,8)|@getchar(temp1,21);
  84.                 case(@body(data2,temp2)<>{},N,{
  85.                     %button @getchar(@getchar(temp1,21)|{   },1,4);
  86.                     data2:=data2|button|{//}|temp2|R});
  87.                 im(Y)
  88.             }
  89.         )
  90.     });
  91. };
  92.  
  93. /* コマンドラインの状態からPF12(送信)が押された */
  94. %cl2m2p12 {
  95.     type(@memo(mno+2,@xlinenum,1)|R);
  96.     case(@mcheck<>0,Y,{mclose(1)});mclear(mno+2);mopen(mno+2)
  97. };
  98.  
  99. /* メモ2(テキスト)の状態からPF12(確定)が押された */
  100. %m22m1p12 {
  101.     %temp @head(@memo(mno+1,@xlinenum,1),R);
  102.     mclose(1);madd(mno+2,temp);mopen(mno+2)
  103. };
  104.  
  105. /* メモ1(一覧)の状態からPF12(確定)が押された */
  106. %m12clp12 {
  107.     %temp1 @memo(mno,@xlinenum,1);
  108.     handle:=@head(@getchar(temp1,21),R);
  109.     case(handle={    },
  110.         Y,{type(@memo(mno+2)|R)},
  111.         N,{type(@memo(mno+2)|to|handle|R)});
  112.     %temp2 {//}|@getchar(temp1,12,8)|@getchar(temp1,21);
  113.     %temp3 @tail(@head(data2,temp2),R)|temp2;
  114.     data2:=temp3|@head(data2,temp3)|@tail(data2,temp3);next:=0;
  115.     case(@mcheck<>0,Y,{mclose(1)});mclear(mno+2);mopen(mno+2)
  116. };
  117.  
  118. /* メモ2(テキスト)の状態からPF11(取消)が押された */
  119. %m22clp11 {
  120.     case(@mcheck<>0,Y,{mclose(1)});mopen(mno+2)
  121. };
  122.  
  123. /* メモ1(一覧)の状態からPF11(取消)が押された */
  124. %m12m2p11 {
  125.     mclose(1);mopen(mno+2)
  126. };
  127.  
  128. /* メモ2(テキスト)の状態からPF1~PF9(ハンドル)が押/クリックされた */
  129. %m22p {
  130.     %temp1 @case(xretc>200,Y,{im(xretc-200)},N,{im(xretc)});
  131.     %temp2 @case(temp1>100,Y,{im(temp1-100)},N,{im(temp1)});
  132.     case(@chgpfno(temp2)<@noline(@memo(mno)),Y,{
  133.         handle:=@gethandle(data2,temp2);
  134.         case(handle={    },
  135.             Y,{type(@memo(mno+2,@xlinenum,1)|R)},
  136.             N,{type(@memo(mno+2,@xlinenum,1)|to|handle|R)});
  137.         %temp3 @head(@skipn(data2,@chgpfno(temp2),R),R)|R;
  138.         data2:=temp3|@head(data2,temp3)|@tail(data2,temp3);next:=0;
  139.         DBG({display(@head(@memo(mno+2,@xlinenum,1),R)|handle|R)});
  140.         mclose(1);mclear(mno+2);mopen(mno+2)
  141.     })
  142. };
  143.  
  144. /* メモ1(一覧)の状態からPF1~PF9(ハンドル)が押/クリックされた */
  145. %m12p {
  146.     %temp1 @case(xretc>200,Y,{im(xretc-200)},N,{im(xretc)});
  147.     %temp2 @case(temp1>100,Y,{im(temp1-100)},N,{im(temp1)});
  148.     case(@chgpfno(temp2)<@noline(@memo(mno)),Y,{
  149.         handle:=@gethandle(data2,temp2);
  150.         case(handle={    },
  151.             Y,{type(@memo(mno+2,@xlinenum,1)|R)},
  152.             N,{type(@memo(mno+2,@xlinenum,1)|to|handle|R)});
  153.         %temp3 @head(@skipn(data2,@chgpfno(temp2),R),R)|R;
  154.         data2:=temp3|@head(data2,temp3)|@tail(data2,temp3);next:=0;
  155.         mclose(1);mclear(mno+2);mopen(mno+2)
  156.     })
  157. };
  158.  
  159. /* メモ1(一覧)がクリックされた */
  160. %uidproc {
  161.     %temp @getchar(@head(@memo(mno,@xlinenum,1),R),12);
  162.     select({"}|temp|{"},3600,{im({})},
  163.         { にPAGEを送る },{
  164.             type({/PA }|@getchar(@head(@memo(mno,@xlinenum,1),R),1,4)|R|
  165.             myhandle|{>}|@memo(mno+2)|R);
  166.             mclose(1);mclear(mno+2);mopen(mno+2)
  167.         },
  168.         { のプロフィール拝見 },{
  169.             type({/PR }|@getchar(@head(@memo(mno,@xlinenum,1),R),12,8)|R);
  170.             mclose(1);mclear(mno+2);mopen(mno+2)
  171.         }
  172.     );
  173. };
  174.  
  175. /* メモの状態からPF10(ログ開始/ログ停止),または,コマンドラインからPF11が押/クリックされた*/
  176. %logrecv {
  177.     case(recv=N,
  178.         Y,{
  179.             case(recvfile={},Y,{
  180.                 %temp @select({ログ格納ファイルが指定されていません。指定して下さい。},
  181.                     3600,{im({})},{ 確認 },{im(Y)});
  182.                 case(temp=Y,Y,{recvfile:=@filesel});
  183.             });
  184.             case(recvfile<>{},Y,{receive(recvfile);recv:=Y});
  185.         },
  186.         N,{stoprec;recv:=N}
  187.     )
  188. };
  189.  
  190. %sortid { [iddata,idfile]
  191.     case(@filechk(idfile)=Y,Y,{workdata:=@read(idfile)});
  192.     %temp1 @getchar(idfile,1,2);%temp2 @body(@getchar(idfile,3),,{\});
  193.     dispoff(Y);command(temp1);command({CD }|temp2);dispoff(N);
  194.     dispoff(Y);command({DEL }|idfile);dispoff(N);
  195.     case(@diskrem<81920,Y,{
  196.         display({"}|idfile|{"のドライブの空きが80KB以下です。処理を中断します。});
  197.         write(idfile,workdata);
  198.         stop
  199.     });
  200.     write(idfile,iddata);
  201.     loop({
  202.         %temp @head(workdata,R);
  203.         workdata:=@body(workdata,R);
  204.         case(temp={},
  205.             Y,{im(N)},
  206.             N,{
  207.                 case(@body(iddata,@getchar(temp,1,8))={},Y,{write(idfile,temp|R)});
  208.                 im(Y)
  209.         })
  210.     })
  211. };
  212.  
  213. %end {
  214.     type({/E}|R);
  215.     wait(20,{ABORT},{\n>},,{\nFORUM>},);
  216.     case(recv=Y,Y,{stoprec});
  217.     case(@mcheck<>0,Y,{mclose(1)});
  218.     mopen(mno);mclose(3);mclose(3);
  219.     case(idfile<>{},Y,{sortid(@memo(mno+1),idfile)});
  220.     case(textfile<>{},Y,{mclose(1)});
  221.     case(idfile<>{},Y,{mopen(mno+1);mclose(3)});
  222.     case(textfile={},Y,{mopen(mno);mclose(3)});
  223.     stop
  224. };
  225.  
  226. /* 初回分のdata1を作る */
  227. %getu1 {
  228.     dispoff(Y);type({/U }|channel|R|{/DAMMY}|R);
  229.     wait(10,{ABORT},{\n JOB   CH  ID       HANDLE  },);
  230.     wait(5,{ABORT},R,);
  231.     loop({
  232.         wait(20,{ABORT},
  233.             {コマンドはありません◆\n},{dispoff(N);im(N)},
  234.             R,{
  235.                 %temp @tail(@body(@laststr(128),,R),R);
  236.                 case(@getchar(temp,1,1)={ },
  237.                     Y,{data1:=data1|temp|R;
  238.                         case(idfile<>{},
  239.                         Y,{case(@mcheck<>0,Y,{mclose(1)});
  240.                             madd(mno+3,@getchar(temp,12)|{//}|day|{//}|forum|R)});
  241.                     },
  242.                     N,{dispoff(N);display(temp|R);dispoff(Y)}
  243.                 );
  244.                 im(Y)
  245.         })
  246.     });
  247.     data1:=data1|{  **   **  ********     \n  **   **  ******** ALL\n};
  248. };
  249.  
  250. /* data1を作る(2回目以降) */
  251. %getu2 {
  252.         var workdata[1024];var waitok[3];var recon[3];
  253.         recon:=N;workdata:={};waitok:=N;
  254.         dispoff(Y);
  255.         case(recv=Y,Y,{stoprec;recon:=N});
  256.         type({/U }|channel|R|{/DAMMY}|R);
  257.         wait(10,{ABORT},{\n JOB   CH  ID       HANDLE  },);
  258.         wait(5,{ABORT},R,);
  259.         loop({
  260.             waitx(20,{case(recv=Y,Y,{receive(recvfile);recon:=Y});dispoff(N);im(N)},
  261.                 {コマンドはありません◆\n},
  262.                     {case(recv=Y,Y,{receive(recvfile);recon:=Y});dispoff(N);waitok:=Y;im(N)},
  263.                 R,{
  264.                     %temp @tail(@body(@laststr(128),,R),R);
  265.                     case(@getchar(temp,1,1)={ },
  266.                         Y,{
  267.                             workdata:=workdata|temp|R;
  268.                             case(@body(data1,,@getchar(temp,12,8))={},
  269.                                 Y,{
  270.                                     dispoff(N);
  271.                                     display({--"}|@getchar(temp,21)|{"が来たよ!!--}|R);
  272.                                     dispoff(Y);
  273.                                     case(idfile<>{},
  274.                                         Y,{case(@mcheck<>0,Y,{mclose(1)});
  275.                                             madd(mno+3,@getchar(temp,12)|{//}|day|{//}|forum|R)});
  276.                             })
  277.                         },
  278.                         N,{dispoff(N);display(temp|R);dispoff(Y) }
  279.                     );
  280.                     im(Y)
  281.             })
  282.         });
  283.         case(recv=Y && recon=N,Y,{receive(recvfile)});
  284.         case(waitok=Y,Y,{
  285.             data1:=workdata|{  **   **  ********     \n  **   **  ******** ALL\n};
  286.             case(@mcheck<>0,Y,{mclose(1)});
  287.             mclear(mno);madd(mno,data1);mopen(mno);mclose(1);mopen(mno+2);
  288.         });
  289. };
  290.  
  291. /***************************************************************************/
  292. %nemchat { [ch,myhandle,int,nowrecv,recvf,text,idfile]
  293.     var channel[2];var inttime[3];var recv[3];var recvfile[64];var textfile[64];
  294.     channel:=ch;inttime:=int;recv:=nowrecv;recvfile:=recvf;textfile:=text;
  295.  
  296.     data1:={};workdata:={};%to { > };
  297.     case(myhandle<>{},Y,{type({/HA }|myhandle|R)});
  298.  
  299.     case(textfile<>{},Y,{
  300.         madd(mno+1,@read(textfile));madd(mno+2,{});
  301.         mopen(mno+1,ULX2,ULY2,DRX2,DRY2,{w});mclose(1);
  302.     });
  303.     
  304.     case(idfile<>{},Y,{
  305.         madd(mno+3,{});mopen(mno+3,ULX1,ULY1,DRX1,DRY1,{r});mclose(2);
  306.         case(textfile<>{},Y,{mclose(1)});
  307.     });
  308.     getu1;
  309.     makebhi(data1);
  310.     DBG({display({data2="}|data2|{"}|R)});
  311.  
  312.     case(@mcheck<>0,Y,{mclose(1)});madd(mno,data1);
  313.     mopen(mno,ULX1,ULY1,DRX1,DRY1,{r});mclose(1);
  314.     mopen(mno+2,ULX3,ULY3,DRX3,DRY3,{w});
  315.     next:=0;
  316.     chat(Y);
  317.     loop({
  318.         %max {9};
  319.         makebtn;
  320.         footnote(foottxt,{b});
  321.         waitx(inttime);
  322.         xretc:=@xtype;
  323.         case(xretc,
  324.             mno,{uidproc},
  325.             mno+1,{case(textfile<>{},Y,{m22m1p12})},
  326.             212,{cl2m2p12},PF12,{cl2m2p12},
  327.             211,{end},PF11,{end},
  328.             210,{logrecv},PF10,{logrecv},
  329.             209,{
  330.                 case(@getchar(foottxt,33,4)={次頁},Y,{next:=next+1});
  331.                 case(next*(max-1)+max-@noline(@memo(mno))>max,Y,{next:=0});
  332.             },
  333.             PF9,{
  334.                 case(@getchar(foottxt,33,4)={次頁},Y,{next:=next+1});
  335.                 case(next*(max-1)+max-@noline(@memo(mno))>max,Y,{next:=0});
  336.             },
  337.             -2,{getu2;makebhi(data1);
  338.                 DBG({display({["/U"入力&data1作成] ルーチンCALL\n})})},
  339.             ,{m22p}
  340.         );
  341.         im(Y)
  342.     });
  343. };
  344.  
  345. /***************************************************************************/
  346. %rtcb @select({ どちらですか?},3600,{im({})},
  347.     { RTC },{im({RT})},
  348.     { CB   },{im({CB})} );
  349. %forum @case(rtcb={RT},
  350.     Y,{im(@input({ フォーラム名を入力して下さい。 例) FTOWNS1}))},
  351.     N,{im({})});
  352. %band @case(rtcb={CB},
  353.     Y,{im(@select({ Bandを選択して下さい。},3600,{im({})},{ A },{im({1})},{ B },{im({2})}))},
  354.     N,{im({})});
  355. %name @input({ ハンドルネームを入力して下さい。});
  356. %txtfile @select({ あらかじめ作成したテキストを利用しますか?},3600,{im({})},
  357.     { 利用する },{%temp @filesel;im(@getcdir2|{\}|temp)},
  358.     { 利用しない },{im({})} );
  359. %idhfile @select({ RTC/CBで出会った人のID,ハンドルを記録しますか?},3600,{im({})},
  360.     { 記録する   },{%temp @filesel;im(@getcdir2|{\}|temp)},
  361.     { 記録しない },{im({})} );
  362. %recvon  {No};
  363. %recvfile {};
  364. case(@mcheck<>0,Y,{mclose(1)});
  365. mno:=@mlast+1;%temp @case(idhfile<>{},Y,{im({4})},N,{im({3})});
  366. case(mno+temp>=10,
  367.     Y,{display({空きのメモが足りません。不要なメモを削除して下さい。\n});stop});
  368. mclear(mno);mclear(mno+1);mclear(mno+2);
  369. madd(mno,{});madd(mno+1,{});madd(mno+2,{});
  370. case(idhfile<>{},Y,{mclear(mno+3);madd(mno+3,{})});
  371. %inttime  @input({"/U" を発行する間隔(秒)を入力して下さい。},,30);
  372. case(rtcb={RT},Y,{type({GO }|forum|R)},N,{type({GO CB}|R)});
  373. loop({
  374.     wait(20,{ABORT},
  375.         {\n>},{im({No})},
  376.         {\nFORUM>},{im({No})},
  377.         {\n続き (改行で表示},{type({\n});im({Yes})},
  378.         {\nmore>},{type({\n});im({Yes})})
  379. });
  380.  
  381. type({TIME\n});
  382. wait(20,{ABORT},{\n  ご利用時間  },);
  383. %day @tail(@body(@laststr(128),,{\n  ご利用時間  }),{\n  });
  384. wait(20,{ABORT},{\n>},,{\nFORUM>},);
  385.  
  386. case(rtcb={CB},
  387.     Y,{type(band|R);wait(20,{ABORT},{\nハンドルネーム\n:},);type(name|R)},
  388.     N,{type({RTC}|R)}
  389. );
  390. wait(20,{ABORT},{まで)\n:},);
  391. %channel  @input({ チャンネルを入力して下さい。},,{1});
  392. type(channel|R);
  393. case(rtcb={CB},
  394.     Y,{wait(20,{ABORT},{終了:/E)*\n})},
  395.     N,{wait(20,{ABORT},{終了:/E)-\n})}
  396. );
  397.  
  398. nemchat(channel,name,inttime,{No},{},txtfile,idhfile);
  399.